const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const config = require('../config/config');
const File = require('../models/File');

const router = express.Router();

// 确保上传目录存在
if (!fs.existsSync(config.uploadDir)) {
    fs.mkdirSync(config.uploadDir, { recursive: true });
}

// 配置multer
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, config.uploadDir);
    },
    filename: function (req, file, cb) {
        // 获取文件扩展名
        const ext = path.extname(file.originalname);
        // 生成基础文件名（不包含扩展名）
        const baseFilename = path.basename(file.originalname, ext);
        let filename = baseFilename + ext;
        let counter = 1;

        // 检查文件是否已存在，如果存在则添加计数
        while (fs.existsSync(path.join(config.uploadDir, filename))) {
            filename = `${baseFilename} (${counter})${ext}`;
            counter++;
        }

        cb(null, filename);
    }
});

const upload = multer({
    storage: storage,
    limits: {
        fileSize: config.maxFileSize // 10MB
    }
});

// 文件上传路由
router.post('/', upload.single('file'), async (req, res) => {
    if (!req.file) {
        return res.status(400).json({ error: '没有文件上传' });
    }

    try {
        console.log('收到文件上传请求:', {
            file: req.file,
            body: req.body
        });

        // 构建文件URL
        const fileUrl = `/uploads/${req.file.filename}`;
        
        // 获取上传者信息
        const uploadedBy = {
            userId: req.body.uploadedBy?.userId || 'anonymous',
            username: req.body.uploadedBy?.username || 'anonymous'
        };

        console.log('上传者信息:', uploadedBy);
        
        // 创建文件记录
        const file = new File({
            filename: req.file.filename,
            originalname: req.file.originalname,
            path: req.file.path.replace(/\\/g, '/'),
            url: fileUrl,
            mimetype: req.file.mimetype,
            size: req.file.size,
            uploadedBy: uploadedBy
        });

        console.log('准备保存文件记录:', file);

        const savedFile = await file.save();
        console.log('文件记录已保存:', savedFile);
        
        // 返回文件信息
        res.json({
            fileId: savedFile._id,
            filename: savedFile.filename,
            originalname: savedFile.originalname,
            url: savedFile.url,
            mimetype: savedFile.mimetype,
            size: savedFile.size
        });
    } catch (error) {
        console.error('文件上传错误:', error);
        res.status(500).json({ error: '文件上传失败' });
    }
});

// 文件下载路由
router.get('/:filename', async (req, res) => {
    const filename = req.params.filename;
    const filePath = path.resolve(config.uploadDir, filename);

    try {
        // 检查文件是否存在
        if (!fs.existsSync(filePath)) {
            return res.status(404).json({ error: '文件不存在' });
        }

        // 检查文件路径是否在上传目录内（安全检查）
        const uploadDirPath = path.resolve(config.uploadDir);
        const realFilePath = path.resolve(filePath);
        if (!realFilePath.startsWith(uploadDirPath)) {
            return res.status(403).json({ error: '访问被拒绝' });
        }

        // 更新下载计数
        await File.findOneAndUpdate(
            { filename: filename },
            { $inc: { downloads: 1 } }
        );

        // 设置正确的Content-Type
        const mimeType = require('mime-types').lookup(filePath) || 'application/octet-stream';
        res.setHeader('Content-Type', mimeType);
        
        // 设置Content-Disposition以支持下载
        res.setHeader('Content-Disposition', `attachment; filename="${encodeURIComponent(filename)}"`);

        // 发送文件
        res.sendFile(realFilePath);
    } catch (error) {
        console.error('文件下载错误:', error);
        res.status(500).json({ error: '文件下载失败' });
    }
});

// 获取文件信息
router.get('/info/:fileId', async (req, res) => {
    try {
        const file = await File.findById(req.params.fileId);
        if (!file || file.isDeleted) {
            return res.status(404).json({ error: '文件不存在' });
        }
        res.json(file);
    } catch (error) {
        console.error('获取文件信息错误:', error);
        res.status(500).json({ error: '获取文件信息失败' });
    }
});

// 删除文件
router.delete('/:fileId', async (req, res) => {
    try {
        const file = await File.findById(req.params.fileId);
        if (!file) {
            return res.status(404).json({ error: '文件不存在' });
        }

        // 标记文件为已删除
        file.isDeleted = true;
        await file.save();

        // 可选：物理删除文件
        const filePath = path.join(config.uploadDir, file.filename);
        if (fs.existsSync(filePath)) {
            fs.unlinkSync(filePath);
        }

        res.json({ message: '文件已删除' });
    } catch (error) {
        console.error('删除文件错误:', error);
        res.status(500).json({ error: '删除文件失败' });
    }
});

module.exports = router; 